import { getCartList, changeCount, delSelect } from '@/api/cart'
import { Toast } from 'vant'

export default {
  namespaced: true,
  state () {
    return {
      // 购车列表
      cartList: []
    }
  },
  mutations: {
    // 提供一个设置 cartList 的 mutations
    setCartList (state, newList) {
      state.cartList = newList
    },
    toggleChecked (state, goodsId) {
      // 让对应的 id 的选项的状态取反
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.isChecked = !goods.isChecked
    },
    toggleAllChecked (state, flag) {
      // 让所有的小选框，同步设置
      state.cartList.forEach(item => {
        item.isChecked = flag
      })
    },
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.goods_num = goodsNum
    }
  },
  actions: {
    /**
     * 获取购物车数据
     * @param {*} context
     */
    async getCartAction (context) {
      const { data } = await getCartList()
      // 注意：后台返回的数据中，不包含复选框的状态，为了实现将来功能，需要手动维护数据，给每一项都添加一个 isChecked 状态（标记当前商品是否选中）
      data.list.forEach(item => {
        item.isChecked = true // 默认是选中状态
      })
      context.commit('setCartList', data.list)
    },
    /**
     * 修改商品数量
     * @param {*} context
     * @param {*} obj
     */
    async changeCountAction (context, obj) {
      const { goodsNum, goodsId, goodsSkuId } = obj
      // 先本地修改
      context.commit('changeCount', { goodsId, goodsNum })
      // 再同步到后台
      await changeCount(goodsId, goodsNum, goodsSkuId)
    },
    /**
     * 删除购物车数据
     * @param {*} context
     */
    async delSelect (context) {
      const selCartList = context.getters.selCartList
      const cartIds = selCartList.map(item => item.id)
      await delSelect(cartIds)
      Toast('删除成功')
      // 注意：删除成功购物车数据需要更新，拉取数据，重新渲染
      // 在 actions 中调用其它 actions。
      context.dispatch('getCartAction')
    }
  },
  getters: {
    /**
     * 求所有商品累加数量
     * @param {*} state
     * @returns
     */
    cartTotal (state) {
      return state.cartList.reduce((sum, item) => {
        return sum + item.goods_num
      }, 0)
    },
    /**
     * 选中的商品项
     * @param {*} state
     * @returns
     */
    selCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    /**
     * 选中的总数
     * @param {*} state
     * @param {*} getters
     * @returns
     */
    selCount (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    /**
     * 选中的总价
     * @param {*} state
     * @param {*} getters
     * @returns
     */
    selPrice (state, getters) {
      return getters.selCartList.reduce((sum, item) => {
        return sum + item.goods_num * item.goods.goods_price_min
      }, 0).toFixed(2)
    },
    /**
     * 选中购物车商品项
     * @param {*} state
     * @returns
     */
    isAllChecked (state) {
      return state.cartList.every(item => item.isChecked)
    }
  }
}
